home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 68K / Lib / test / img / xtestview.py < prev   
Text File  |  1996-05-20  |  5KB  |  176 lines

  1. import sys, Xt, Xm, X, img, imgformat, imgconvert
  2.  
  3. imgconvert.settrace(1)
  4.  
  5. error = 'xtestview.error'
  6.  
  7. vselect = {}
  8.  
  9. # handle arguments
  10. i = 1
  11. while i < len(sys.argv):
  12.     if sys.argv[i] == '-visualid':
  13.         del sys.argv[i]
  14.         if i == len(sys.argv):
  15.             raise error, '-visualid needs an argument'
  16.         vselect['visualid'] = eval(sys.argv[i])
  17.         del sys.argv[i]
  18.         continue
  19.     if sys.argv[i] == '-depth':
  20.         del sys.argv[i]
  21.         if i == len(sys.argv):
  22.             raise error, '-depth needs an argument'
  23.         vselect['depth'] = eval(sys.argv[i])
  24.         del sys.argv[i]
  25.         continue
  26.     if sys.argv[i] == '-visual':
  27.         del sys.argv[i]
  28.         if i == len(sys.argv):
  29.             raise error, '-visual needs an argument'
  30.         if sys.argv[i] == 'TrueColor':
  31.             vselect['class'] = X.TrueColor
  32.         elif sys.argv[i] == 'PseudoColor':
  33.             vselect['class'] = X.PseudoColor
  34.         else:
  35.             raise error, 'visual type not supported'
  36.         del sys.argv[i]
  37.         continue
  38.     i = i + 1
  39.  
  40. # default is to use TrueColor visual
  41. if not vselect.has_key('class') and not vselect.has_key('visualid'):
  42.     vselect['class'] = X.TrueColor
  43.  
  44. # initialize window system
  45. Xt.ToolkitInitialize()
  46. dpy = Xt.OpenDisplay(None, None, 'XTestview', [], sys.argv)
  47.  
  48. # find deepest visual that satisfies the requirements.
  49. visuals = dpy.GetVisualInfo(vselect)
  50. if not visuals:
  51.     raise error, 'requested visual does not exist'
  52. visual = visuals[0]
  53. for v in visuals:
  54.     if v.depth > visual.depth and v.depth in (8, 24):
  55.         visual = v
  56.  
  57. if visual.c_class == X.TrueColor:
  58.     vtype = 'TrueColor'
  59. elif visual.c_class == X.PseudoColor:
  60.     vtype = 'PsuedoColor'
  61. else:
  62.     vtype = 'unknown'
  63. print 'Using visual of type %s and depth %d' % (vtype, visual.depth)
  64. # for now ignore the fact that the colors may not be in the right order
  65. if visual.depth == 8:
  66.     format = imgformat.xrgb8
  67.     print 'Using format xrgb8'
  68. elif visual.depth == 24:
  69.     format = imgformat.rgb
  70.     print 'Using format rgb'
  71. else:
  72.     raise error, 'only visuals of depth 8 and 24 supported'
  73.  
  74. # create a colormap
  75. colormap = visual.CreateColormap(X.AllocNone)
  76. if visual.c_class == X.PseudoColor:
  77.     # allocate colormap entries
  78.     (plane_masks, pixels) = colormap.AllocColorCells(1, 8, 1)
  79.     xcolors = []
  80.     for n in range(256):
  81.         xcolors.append(n + pixels[0],
  82.                    int((((n >> 5) & 7) / 7.) * 255.)<<8,
  83.                    int((((n     ) & 7) / 7.) * 255.)<<8,
  84.                    int((((n >> 3) & 3) / 3.) * 255.)<<8,
  85.                    X.DoRed|X.DoGreen|X.DoBlue)
  86.     colormap.StoreColors(xcolors)
  87.     del plane_masks, pixels, xcolors, n
  88.  
  89. # create the main widget
  90. main = Xt.CreateApplicationShell('shell', Xt.ApplicationShell,
  91.                  {'visual': visual,
  92.                   'depth': visual.depth,
  93.                   'colormap': colormap,
  94.                   'mappedWhenManaged': X.FALSE})
  95.  
  96. # clean up a little
  97. del visuals, v, vselect, vtype        # don't need these...
  98.  
  99. class view:
  100.     def __init__(self, title, fullname):
  101.         self.fullname = fullname
  102.         print 'Reading from',fullname,'...'
  103.         reader = img.reader(format, fullname)
  104.         self.data = reader.read()
  105.         self.width = reader.width
  106.         self.height = reader.height
  107.         self.window = main.CreatePopupShell('shell',
  108.                             Xt.ApplicationShell,
  109.                             {'title': title,
  110.                              'visual': visual,
  111.                              'depth': visual.depth,
  112.                              'colormap': colormap})
  113.         widget = self.window.CreateManagedWidget(
  114.             'image', Xm.DrawingArea,
  115.             {'width': self.width, 'height': self.height})
  116.         self.window.RealizeWidget()
  117.         self.window.Popup(0)
  118.         self.gc = widget.CreateGC({})
  119.         self.image = visual.CreateImage(visual.depth, X.ZPixmap, 0,
  120.                         self.data,
  121.                         self.width, self.height,
  122.                         format.descr['align'], 0)
  123.         widget.AddCallback('exposeCallback', self.expose, None)
  124.         widget.AddCallback('inputCallback', self.input, None)
  125.  
  126.     def expose(self, w, client_data, call_data):
  127.         self.gc.PutImage(self.image, 0, 0, 0, 0, self.width, self.height)
  128.  
  129.     def input(self, w, client_data, call_data):
  130.         import Xlib
  131.         event = call_data.event
  132.         if event.type == X.KeyPress:
  133.             string = Xlib.LookupString(event)[0]
  134.             if not string:
  135.                 return
  136.             if string[0] in ('w', 'W'):
  137.                 self.write()
  138.             if string[0] in ('\033', 'q', 'Q'):
  139.                 w.DestroyWidget()
  140.                 self.window.DestroyWidget()
  141.                 if args:
  142.                     a = args[0]
  143.                     del args[0]
  144.                     view(a, a)
  145.                 else:
  146.                     raise error
  147.  
  148.     def write(self):
  149.         import os
  150.         head, tail = os.path.split(self.fullname)
  151.         if not head:
  152.             head = '.'
  153.         newname = head + '/@copy-' + tail
  154.         print 'Writing to',newname,'...'
  155.         try:
  156.             wrr = img.writer(format, newname)
  157.         except img.unsupported_error, arg:
  158.             print '** Failed, no converter for', arg[0].name, \
  159.               'to something supported by this filetype'
  160.             return
  161.         wrr.width, wrr.height = self.width, self.height
  162.         wrr.write(self.data)
  163.  
  164. args = sys.argv[1:]
  165. if not args:
  166.     print 'Usage:',sys.argv[0],'file ...'
  167.     sys.exit(1)
  168. a = args[0]
  169. del args[0]
  170. view(a, a)
  171.  
  172. try:
  173.     Xt.MainLoop()
  174. except error:
  175.     pass
  176.